package com.tensquare.manager.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import util.JwtUtil;

import javax.servlet.http.HttpServletRequest;

/**
 * @description
 * @author: xu1
 **/

//网关过滤器

// 经过了网关过滤器后，head 头信息 会丢失
// 因此要在 过网关 过滤器的时候 进行 取出来再次转发

@Component
public class ManagerFilter extends ZuulFilter {

    @Autowired
    private JwtUtil jwtUtil;

    //返回值就是 设置
    //在请求前pre 或请求后 post 执行
    @Override
    public String filterType() {
        return "pre";
    }

    //多个过滤器的时候的 执行顺序，数字越小，表示越先执行
    @Override
    public int filterOrder() {
        return 0;
    }

    //当前过滤器是否开启
    //true 表示开启
    @Override
    public boolean shouldFilter() {
        return true;
    }

    //过滤器内执行的操作
    //return 任何object的值 都表示继续 执行， 执行跟放行不一样
    //setsendzullresponse(false)表示不再执行
    @Override
    public Object run() throws ZuulException {
        System.out.println("进过后台过滤器了");

        //得到request上下文
        RequestContext requestContext = RequestContext.getCurrentContext();
        //得到request域
        HttpServletRequest request = requestContext.getRequest();

//        这俩情况直接 让它不再走下面的  过滤器

        //过网关的请求 都是两次， 第一次是OPTIONS 类型的 为了 测试  路由的地址通不通
        if(request.getMethod().equals("OPTIONS")){
            return null;
        }

        String url = request.getRequestURL().toString();
        if(url.indexOf("login")>0){//有URI、URL
            //0表示 不存在
            //indexOf 返回 请求地址 中的位置
            System.out.println("是否是登录页面的url"+url);
            return null;
        }

        //得到头信息
        String header = request.getHeader("Authorization");
        //判断头信息
        if(header!=null&&!"".equals(header)){
            if(header.startsWith("Bearer ")){
                String token = header.substring(7);
                //解析 token try catch
                try {
                    Claims claims = jwtUtil.parseJWT(token);
                    String roles = (String) claims.get("roles");
                    if(roles.equals("admin")){
                        //传递头信息
                        requestContext.addZuulRequestHeader("Authorization",header);
                        return null;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        requestContext.setSendZuulResponse(false);//终止运行
        requestContext.setResponseStatusCode(403);//403 401 都是权限不足，403是security里的
        requestContext.setResponseBody("权限不足");//传递中文
        requestContext.getResponse().setContentType("text/html;charset=utf-8");//处理response中文乱码
        //各种 map 对应关系 在tomcat的web.xml里面 基本都有
        //中文文本 text/html;
        //json    application/json

        return null;
    }
}

